
#ifndef __SCFSRBTREE_H__
#define __SCFSRBTREE_H__
#include "rbtree.h"
#include "x86.h"
// 定义结构体 cfs_node
typedef struct mytask {
    char* p_name;
    u32 pid;
    int priority;
    int ticks;
}mytask;

typedef struct myproc {
    mytask task;
}myproc;

typedef struct cfs_node {
    struct rb_node node; // 红黑树节点
    char *keystring;     
    myproc* proc;
    u32 lock;
    int nice;
    int vruntime;
}cfs_node;

static const int sched_prio_to_weight[40] = {
 /* -20 */     88761,     71755,     56483,     46273,     36291,
 /* -15 */     29154,     23254,     18705,     14949,     11916,
 /* -10 */      9548,      7620,      6100,      4904,      3906,
 /*  -5 */      3121,      2501,      1991,      1586,      1277,
 /*   0 */      1024,       820,       655,       526,       423,
 /*   5 */       335,       272,       215,       172,       137,
 /*  10 */       110,        87,        70,        56,        45,
 /*  15 */        36,        29,        23,        18,        15,
};

#define NICE_0_WEIGHT 1024

static u32 cfs_lock = 0;
static int all_proc_pri = 0;

// 初始化红黑树根节点
// struct rb_root cfs_tree_root = RB_ROOT;

// 比较函数，用于比较两个 cfs_node 结构体的 keystring
int mytype_cmp(const char *a, const char *b);

// cfstree插入比较
int cfs_cmp(cfs_node* n1, cfs_node* n2);

// 增加 vruntime
int add_vruntime(cfs_node* node, int ticks);

// 初始化cfs_node
struct cfs_node *cfs_node_init(cfs_node* node, myproc* proc);

// 创建一个CFS节点
struct cfs_node *create_cfs_node(myproc *proc, int nice);

// 搜索操作
struct cfs_node *cfs_search(struct rb_root *root, u32 pid);

// 插入操作
int cfs_insert(struct rb_root *root, struct cfs_node *data);

// 删除操作
int cfs_remove(struct rb_root *root, struct cfs_node *data);

// 从CFS调度器中删除进程
int cfs_remove_process(struct rb_root *root, myproc *proc);

// CFS调度函数：选择下一个要执行的进程
myproc *cfs_schedule_next(struct rb_root *root);

// 更新进程的运行时间（vruntime）
int update_vruntime(struct cfs_node *node, int ticks);

// 打印进程信息
void print_process_info(myproc *proc);

// 遍历CFS调度器并打印进程信息
void print_cfs_scheduler(struct rb_root *root);

// 更新节点的 vruntime 并调整红黑树结构
int cfs_update_vruntime(struct rb_root *root, struct cfs_node *node, int new_vruntime);
#endif